package com.huaru.formboot.form.util;


import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * 菜单树通用
 * 目前仅支持integer类型和string类型  后续其他类型可自行扩展
 * 使用方法  只需要修改id和pid以及children定义字段就可以
 * wz
 */
public class Tree<E> {
    /**
     * 构建通用树方法
     * @param t 数据list集合
     * @param pid 根节点父id
     * @param <T> 集合泛型类
     * @return
     */
    public <T> List<T> createTree(List<T> t,E pid) throws NoSuchFieldException, IllegalAccessException {
        //创建空的list泛型集合
        List<T> lists = new ArrayList<>();
        for (int i = 0; i < t.size(); i++) {
              T t1 = t.get(i);
              Class<?> aClass = t1.getClass();
              Field id = aClass.getDeclaredField("tableId");
              Class<?> type = id.getType();
               id.setAccessible(true);
              //判断字段类型  根据不同类型做不同处理
               if(type.getTypeName().equals("java.lang.String")){
                   String id1 = id.get(t1).toString();
                   //通过反射获取父id唯一属性 todo 可自定义修改名称
                   Field parentId = aClass.getDeclaredField("tableParentId");
                   parentId.setAccessible(true);
                   String parentId1 = parentId.get(t1).toString();
                   if(parentId1.equals(pid)){
                       //通过实例对象获取子集属性 todo 可自定义修改名称
                       Field children = aClass.getDeclaredField("children");
                       children.setAccessible(true);
                       children.set(t1,createTree(t,(E)id1));
                       //
                       lists.add(t1);
                   }
               }
               else {
                   Integer id1 = (Integer)id.get(t1);
                   //todo 可自定义修改名称
                   Field parentId = aClass.getDeclaredField("tableParentId");
                   parentId.setAccessible(true);
                   Integer parentId1 = (Integer) parentId.get(t1);
                   if(parentId1.equals(pid)){
                      //todo 可自定义修改名称
                       Field children = aClass.getDeclaredField("children");
                       children.setAccessible(true);
                       children.set(t1,createTree(t,(E)id1));
                       lists.add(t1);
                   }
               }
        }
        return lists;
    }
}
